// core/init_conf.go
// =============================================================================
// | 包: core                                                                 |
// | 模块: 配置初始化                                                          |
// | 功能: 负责读取和解析应用程序配置文件                                       |
// =============================================================================
package core

import (
	"blog_server/conf"  // 配置定义包 - 包含系统所有配置项的结构体定义
	"blog_server/flags" // 命令行参数包 - 处理启动时传入的命令行参数
	"fmt"                // 格式化包 - 用于字符串格式化和输出
	"os"                 // 操作系统包 - 提供文件操作等系统功能

	"gopkg.in/yaml.v2" // YAML解析库 - 用于解析YAML格式的配置文件
)

// =============================================================================
// | 常量定义                                                                  |
// =============================================================================

// confPath - 配置文件路径常量
// | 默认值: "setting.yaml" - 相对于程序工作目录                               |
// | 用途: 定义默认配置文件的位置                                              |
var confPath = "setting.yaml" // 默认配置文件路径

// =============================================================================
// | 函数: ReadConf                                                          | 
// | 参数: 无                                                                  |
// | 返回: @c - *conf.Config - 初始化后的配置对象指针                          |
// | 功能: 读取并解析配置文件内容                                              |
// | 说明: 从指定路径读取YAML配置文件，解析为结构化配置对象                    |
// |----------------------------------------------------------------------------| 
// | 流程:                                                                     |
// | 1. 读取配置文件内容 - 从命令行参数指定的文件路径读取原始字节数据           |
// | 2. 创建配置容器实例 - 分配内存空间存储解析后的配置数据                     |
// | 3. 解析YAML配置数据 - 将字节数据转换为结构化的配置对象                    |
// | 4. 处理解析错误 - 如有错误则抛出异常并终止程序                            |
// | 5. 输出配置信息 - 打印解析后的配置内容，便于调试验证                      |
// | 6. 返回初始化完成的配置对象                                               |
// =============================================================================
func ReadConf() (c *conf.Config) {
	// Step1 - 读取配置文件内容
	// | 从命令行参数指定的文件路径读取配置内容                                   |
	byteData, err := os.ReadFile(flags.FlagOptions.File) // 读取配置文件内容到字节数组

	// ErrorCheck - 检查文件读取结果
	if err != nil {
		// Exception - 文件读取失败时抛出异常                                      |
		panic(err) // 配置文件读取失败时抛出异常，终止程序
	}

	// Step2 - 创建配置容器实例
	// | 分配内存空间存储解析后的配置数据                                         |
	c = new(conf.Config) // 创建配置结构体实例

	// Step3 - 解析YAML配置数据
	// | 将YAML格式的字节数据转换为结构化的配置对象                               |
	err = yaml.Unmarshal(byteData, &c) // 将YAML字节数据解析到配置结构体

	// ErrorCheck - 检查YAML解析结果
	if err != nil {
		// Exception - YAML格式错误时抛出异常                                      |
		panic(fmt.Errorf("配置文件格式错误: %v", err)) // 配置格式错误时抛出异常，终止程序
	}

	// Step4 - 输出配置信息（调试用途）
	// | 打印解析后的配置内容，便于调试验证                                       |
	fmt.Printf("配置信息: %v\n", c) // 打印解析后的配置信息

	// 返回初始化完成的配置对象
	return // 返回配置对象指针
}